#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
TqSdk Trader 演示脚本
展示框架的主要功能和使用方法
"""

import asyncio
import sys
from pathlib import Path

# 添加项目路径
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))

async def demo_basic_usage():
    """演示基本使用"""
    print("🎯 演示1: 基本框架使用")
    print("-" * 40)

    try:
        # 1. 导入主要组件
        from config.config_manager import ConfigManager
        from core.api_manager import APIManager
        from core.trading_manager import TradingManager
        from data.data_manager import DataManager, MarketDataManager
        from risk.risk_manager import RiskManager

        # 2. 创建临时配置
        import tempfile
        config_content = """
api:
  account: "demo_account"
  password: "demo_password"
  debug: true

strategy:
  name: "demo_strategy"
  symbol: "SHFE.rb2401"
  volume: 1

risk:
  max_daily_loss: 1000
  stop_loss_points: 10
"""

        with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
            f.write(config_content)
            config_file = f.name

        # 3. 初始化配置
        config = ConfigManager(config_file)
        print("✅ 配置管理器初始化成功")

        # 4. 初始化API管理器
        api_manager = APIManager()
        api_manager.config = config
        print("✅ API管理器初始化成功")

        # 5. 初始化交易管理器
        trading_manager = TradingManager()
        await trading_manager.initialize(api_manager)
        print("✅ 交易管理器初始化成功")

        # 6. 初始化市场数据管理器
        market_data_manager = MarketDataManager()
        await market_data_manager.initialize(api_manager)
        print("✅ 市场数据管理器初始化成功")

        # 7. 初始化数据管理器
        data_manager = await market_data_manager.get_data_manager("SHFE.rb2401")
        print("✅ 数据管理器初始化成功")

        # 8. 初始化风险管理器
        risk_manager = RiskManager()
        print("✅ 风险管理器初始化成功")

        print("\n🎉 基本框架演示完成！")
        return True

    except Exception as e:
        print(f"❌ 演示失败: {e}")
        return False
    finally:
        if 'config_file' in locals():
            import os
            os.unlink(config_file)

async def demo_strategy_usage():
    """演示策略使用"""
    print("\n🎯 演示2: 双均线策略使用")
    print("-" * 40)

    try:
        # 1. 导入策略相关组件
        from strategies.dual_ma_strategy import DualMovingAverageStrategy
        from strategies.base_strategy import get_strategy_manager

        # 2. 创建策略配置
        config = {
            'name': 'demo_dual_ma',
            'symbol': 'SHFE.rb2401',
            'volume': 1,
            'short_period': 3,
            'long_period': 5
        }

        # 3. 创建策略实例
        strategy = DualMovingAverageStrategy('SHFE.rb2401', config)
        print("✅ 双均线策略创建成功")
        print(f"   合约: {strategy.symbol}")
        print(f"   短期均线: {strategy.short_period}周期")
        print(f"   长期均线: {strategy.long_period}周期")
        print(f"   交易手数: {strategy.volume}")

        # 4. 注册到策略管理器
        strategy_manager = get_strategy_manager()
        await strategy_manager.register_strategy(strategy)
        print("✅ 策略注册成功")

        # 5. 获取策略状态
        status = strategy.get_status_info()
        print(f"✅ 策略状态: {status['status']}")

        # 6. 获取策略参数
        params = strategy.get_parameters()
        print(f"✅ 策略参数: {params}")

        print("\n🎉 策略演示完成！")
        return True

    except Exception as e:
        print(f"❌ 策略演示失败: {e}")
        return False

async def demo_error_handling():
    """演示错误处理"""
    print("\n🎯 演示3: 错误处理机制")
    print("-" * 40)

    try:
        # 1. 导入异常处理相关组件
        from utils.exceptions import (
            TqSdkTraderError, APIError, TradingError,
            validate_symbol, validate_positive_number
        )

        # 2. 演示验证函数
        print("测试参数验证:")

        # 有效的合约代码
        assert validate_symbol("SHFE.rb2401") == True
        print("✅ 合约代码验证: SHFE.rb2401 - 通过")

        # 无效的合约代码
        assert validate_symbol("invalid") == False
        print("✅ 合约代码验证: invalid - 拒绝")

        # 有效的正数
        assert validate_positive_number(100) == True
        print("✅ 正数验证: 100 - 通过")

        # 无效的正数
        assert validate_positive_number(-50) == False
        print("✅ 正数验证: -50 - 拒绝")

        # 3. 演示异常处理
        print("\n测试异常处理:")
        try:
            raise APIError("模拟API错误")
        except APIError as e:
            print(f"✅ API异常捕获: {e}")

        try:
            raise TradingError("模拟交易错误")
        except TradingError as e:
            print(f"✅ 交易异常捕获: {e}")

        print("\n🎉 错误处理演示完成！")
        return True

    except Exception as e:
        print(f"❌ 错误处理演示失败: {e}")
        return False

async def demo_integration_flow():
    """演示集成流程"""
    print("\n🎯 演示4: 完整集成流程")
    print("-" * 40)

    try:
        # 1. 导入所有主要组件
        from config.config_manager import ConfigManager
        from core.api_manager import APIManager
        from core.trading_manager import TradingManager
        from data.data_manager import MarketDataManager
        from risk.risk_manager import RiskManager
        from strategies.dual_ma_strategy import create_dual_ma_strategy
        from strategies.base_strategy import get_strategy_manager

        # 2. 创建完整配置
        import tempfile
        config_content = """
api:
  account: "integration_test"
  password: "integration_test"
  debug: true

strategy:
  name: "integration_strategy"
  symbol: "SHFE.rb2401"
  volume: 1
  short_period: 5
  long_period: 20

risk:
  max_daily_loss: 1000
  stop_loss_points: 10
  take_profit_points: 20
"""

        with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
            f.write(config_content)
            config_file = f.name

        # 3. 初始化所有组件
        print("初始化组件...")

        # 配置管理器
        config = ConfigManager(config_file)
        print("✅ 配置管理器")

        # API管理器
        api_manager = APIManager()
        api_manager.config = config
        print("✅ API管理器")

        # 交易管理器
        trading_manager = TradingManager()
        await trading_manager.initialize(api_manager)
        print("✅ 交易管理器")

        # 数据管理器
        market_data_manager = MarketDataManager()
        await market_data_manager.initialize(api_manager)
        print("✅ 数据管理器")

        # 风险管理器
        risk_manager = RiskManager()
        print("✅ 风险管理器")

        # 策略管理器
        strategy_manager = get_strategy_manager()
        print("✅ 策略管理器")

        # 4. 创建和配置策略
        print("\n配置策略...")
        strategy = await create_dual_ma_strategy("SHFE.rb2401", config.strategy.__dict__)
        await strategy_manager.start_strategy("integration_strategy", "SHFE.rb2401")
        print("✅ 策略创建并启动")

        # 5. 验证集成状态
        print("\n验证集成状态...")

        # 检查交易管理器状态
        trading_summary = await trading_manager.get_trading_summary()
        assert 'total_orders' in trading_summary
        print("✅ 交易管理器状态正常")

        # 检查策略状态
        strategy_status = await strategy_manager.get_strategy_status("dual_ma_strategy", "SHFE.rb2401")
        assert 'status' in strategy_status
        print("✅ 策略状态正常")

        # 检查风险管理器状态
        risk_summary = risk_manager.get_risk_summary()
        assert 'daily_pnl' in risk_summary
        print("✅ 风险管理器状态正常")

        # 6. 演示组件间通信
        print("\n演示组件间通信...")

        # 创建数据管理器实例
        data_manager = await market_data_manager.get_data_manager("SHFE.rb2401")

        # 验证数据管理器与API管理器的连接
        assert data_manager.api_manager == api_manager
        print("✅ 数据管理器与API管理器通信正常")

        # 验证策略与数据管理器的连接
        assert strategy.symbol == "SHFE.rb2401"
        print("✅ 策略与数据管理器通信正常")

        print("\n🎉 完整集成流程演示完成！")
        print("✅ 所有组件协同工作正常")
        return True

    except Exception as e:
        print(f"❌ 集成流程演示失败: {e}")
        import traceback
        traceback.print_exc()
        return False
    finally:
        if 'config_file' in locals():
            import os
            os.unlink(config_file)

def demo_main_usage():
    """演示主程序使用"""
    print("\n🎯 演示5: 主程序使用方法")
    print("-" * 40)

    print("""
📖 TqSdk Trader 使用方法:

1. 🎯 直接运行主程序:
   python main.py

2. 🎯 指定配置文件运行:
   python main.py config/settings.yaml

3. 🎯 使用便捷启动脚本:
   python run.py

4. 🎯 在Python代码中使用:
   from main import run_trader
   run_trader("config/settings.yaml")

5. 🎯 作为模块导入使用:
   from tqsdk_trader import run_trader
   run_trader()

配置说明:
- 📄 默认配置文件: config/settings.yaml
- 🔧 可以自定义配置参数
- 📊 支持热重载配置

主要特性:
- 🚀 异步架构，支持高并发
- 🛡️ 完整的风险管理
- 📈 多种技术指标支持
- 🎯 策略插件化架构
- 📊 实时监控和日志
    """)

async def run_all_demos():
    """运行所有演示"""
    print("🚀 TqSdk Trader 功能演示")
    print("=" * 60)

    demos = [
        ("基本框架使用", demo_basic_usage),
        ("策略使用演示", demo_strategy_usage),
        ("错误处理演示", demo_error_handling),
        ("集成流程演示", demo_integration_flow),
    ]

    results = []
    for demo_name, demo_func in demos:
        try:
            result = await demo_func()
            results.append((demo_name, result))
        except Exception as e:
            print(f"❌ {demo_name} 异常: {e}")
            results.append((demo_name, False))

    # 显示演示结果
    print("\n" + "=" * 60)
    print("📊 演示结果汇总:")

    successful = 0
    for demo_name, result in results:
        status = "✅ 通过" if result else "❌ 失败"
        print("15")
        if result:
            successful += 1

    print(f"\n🎯 演示完成: {successful}/{len(results)} 通过")

    if successful == len(results):
        print("🎉 所有演示成功！框架功能完整。")
    else:
        print("⚠️ 部分演示失败，请检查相关功能。")

    # 显示主程序使用方法
    demo_main_usage()

def main():
    """主函数"""
    try:
        asyncio.run(run_all_demos())
    except KeyboardInterrupt:
        print("\n👋 演示被用户中断")
    except Exception as e:
        print(f"❌ 演示运行异常: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
